package com.design.patterns.principle.interfacesegregationprinciple.observe;

/**
 * 遵守最小接口隔离原则 将接口划分为最下的，互不影响的多个接口
 *
 * 场景：
 *      1、接口DemoInterface分割成3个不同的接口
 *      2、类B实现多个接口
 *      3、类D实现多个接口
 *      4、类A依赖接口DemoInterface（类B），只使用到了接口1的1方法、接口2的2，3方法
 *      5、类C依赖接口DemoInterface（类C），只使用到了接口1的1方法，接口3的4，5方法
 *
 * 优点：解决类A依赖接口时，会依赖不需要的方法。松耦合
 * @author Wangzhiwen
 */
public class ObserveInterfaceSegregationPrinciple {

    public static void main(String[] args) {

        A a = new A();
        B b = new B();
        a.method1(b);
        a.method2(b);
        a.method3(b);

        C c = new C();
        D d = new D();
        c.method1(d);
        c.method4(d);
        c.method5(d);

    }

}

class A{

    public void method1(DemoInterface1 demoInterface1){
        demoInterface1.method1();
    }

    public void method2(DemoInterface2 demoInterface2){
        demoInterface2.method2();
    }

    public void method3(DemoInterface2 demoInterface2){
        demoInterface2.method3();
    }

}

class C{

    public void method1(DemoInterface1 demoInterface1){
        demoInterface1.method1();
    }

    public void method4(DemoInterface3 demoInterface3){
        demoInterface3.method4();
    }

    public void method5(DemoInterface3 demoInterface3){
        demoInterface3.method5();
    }
}

interface DemoInterface1{
    void method1();
}

interface DemoInterface2{
    void method2();
    void method3();
}

interface DemoInterface3{
    void method4();
    void method5();
}

class B implements DemoInterface1,DemoInterface2{

    @Override
    public void method1() {
        System.out.println("B实现了方法1");
    }

    @Override
    public void method2() {
        System.out.println("B实现了方法2");
    }

    @Override
    public void method3() {
        System.out.println("B实现了方法3");
    }
}

class D implements DemoInterface1,DemoInterface3{

    @Override
    public void method1() {
        System.out.println("D实现了方法1");
    }

    @Override
    public void method4() {
        System.out.println("D实现了方法4");
    }

    @Override
    public void method5() {
        System.out.println("D实现了方法5");
    }
}
